#include "struct.h"
#include "CreerListeCh.h"

/*************************************************
**  Zone de déclaration des variables globales  **
*************************************************/
//ST_RES *Tete_Res=NULL;
//ST_FAITS *Tete_Faits=NULL;

/*******************************************************************
**  [Fonction LireRegles]                                         **
**    Lit le fichier de règles et le transforme en liste chainée  **
*******************************************************************/
void LireRegles(FILE* fp, ST_RES* Tete_Res)
{
	int flag=0;
	char mot[MAXSIZE];
	ST_COND *Tete_Cond=NULL;
	memset(mot,0,MAXSIZE*sizeof(char));
	
	while((fscanf(fp," %s", mot))!=EOF) //fscanf lit while(mot!=' ')
	{   
		if(!strcmp(mot,"->"))
			flag=1;
		
		if(flag==0)
			Tete_Cond=Creer_MaillonCond(Tete_Cond,mot);	
		else
		{
			if((fscanf(fp," %s", mot))!=EOF)
			{
				if(mot[(strlen(mot)-1)]==';')
					mot[(strlen(mot)-1)]='\0';
				Tete_Res=Creer_MaillonRes(Tete_Res,Tete_Cond,mot);
			}
			flag=0;
			Tete_Cond=NULL;
		}		
	}
}

/*******************************************************************
**  [Fonction LireFaits]					  **
**    Lit le fichier de faits et le transforme en liste chainée   **
*******************************************************************/
void LireFaits(FILE* fp, ST_FAITS* Tete_Faits)
{
	char mot[MAXSIZE];
	memset(mot,0,MAXSIZE*sizeof(char));
	
	while((fscanf(fp," %s", mot))!=EOF) //fscanf lit while(mot!=' ')
	{   
		if(mot[(strlen(mot)-1)]==';')
			mot[(strlen(mot)-1)]='\0';
		Tete_Faits=Creer_MaillonFaits(Tete_Faits,mot);		
	}
}

/******************************************************************
**  [Fonction Creer_MaillonCond]			         **
**    Créer le maillon pour une condition dans la liste chainée  **
**    des regles  					         **
******************************************************************/
ST_COND* Creer_MaillonCond(ST_COND* pt_tete, char* str)
{  
	ST_COND *new=NULL, *tmp=NULL;
	
	new=(ST_COND*)malloc(sizeof(ST_COND));
	memset(new->cond,0,MAXSIZE*sizeof(char));
	strcpy(new->cond, str);
	new->suiv=NULL;
	
	if(pt_tete==NULL){ 
		//si liste vide ajout en tete
		new->suiv=pt_tete;
		pt_tete=new;
	}
	else{ 
		//sinon ajout en fin
		tmp=pt_tete;
		while(tmp->suiv!=NULL)
			tmp=tmp->suiv;
		
		tmp->suiv=new;
	}
	return pt_tete;
}

/****************************************************************
**  [Fonction Creer_MaillonRes]				       **
**    Créer le maillon pour un résultat dans la liste chainée  **
**    des regles  					       **
****************************************************************/
ST_RES* Creer_MaillonRes(ST_RES* pt_tete, ST_COND* Tete_Cond, char* str)
{  
	ST_RES *new=NULL, *tmp=NULL;
	
	new=(ST_RES*)malloc(sizeof(ST_RES));
	memset(new->res,0,MAXSIZE*sizeof(char));
	strcpy(new->res, str);
	new->suiv=NULL;
	new->TeteListCond=Tete_Cond;
	
	if(pt_tete==NULL){
		//si liste vide ajout en tete
		new->suiv=pt_tete;
		pt_tete=new;
	}
	else {
		//sinon ajout en fin
		tmp=pt_tete;
		while(tmp->suiv!=NULL)
			tmp=tmp->suiv;
		
		tmp->suiv=new;
	}
	return pt_tete;
}

/************************************************************
**  [Fonction Creer_MaillonFaits]			   **
**    Créer le maillon pour un fait dans la liste chainée  **
**    des faits  					   **
************************************************************/
ST_FAITS* Creer_MaillonFaits(ST_FAITS* pt_tete, char* str)
{  
	ST_FAITS *new=NULL, *tmp=NULL;
	
	new=(ST_FAITS*)malloc(sizeof(ST_FAITS));
	memset(new->fait,0,MAXSIZE*sizeof(char));
	strcpy(new->fait, str);
	new->suiv=NULL;
	
	if(pt_tete==NULL){
		//si liste vide ajout en tete
		new->suiv=pt_tete;
		pt_tete=new;
	}
	else {
		//sinon ajout en fin
		tmp=pt_tete;
		while(tmp->suiv!=NULL)
			tmp=tmp->suiv;
		
		tmp->suiv=new;
	}
	return pt_tete;
}

/*********************************************************
**  [Fonction OuvrirFic]				**
**    Ouvre le fichier passé en paramètre dans le mode	**
**    spécifié en paramètre par la variable mode	**
*********************************************************/
FILE* OuvrirFic(char* NomFic,char* mode)
{
	FILE* f=NULL;
	if ((f = fopen(NomFic, mode)) == NULL)
	{
		printf("Erreur d'ouverture du fichier %s !\n",NomFic);
		return NULL;
		//exit(qqch) ??
	}
	else
		return f;
}

/********************************************
**  [Fonction FermerFichier]		   **
**    Ferme le fichier passé en paramètre  **
********************************************/
void FermerFichier(FILE* fp)
{
	if(fclose(fp))
		printf("Erreur fermeture\n");	
}

/*********************************************************
**  [Fonction FreeListeRegles]		   		**
**    Supprime tous les maillons de la liste chainée    **
**    indiquée par indic ("R"=Regles / "F"=Faits)       **
*********************************************************/
void FreeListe(char indic, ST_RES* Tete_Res, ST_FAITS* Tete_Faits)
{
	ST_RES* tmpR=Tete_Res;
	ST_RES* tmpR2=NULL;
	ST_COND* tmpC=Tete_Res->TeteListCond;
	ST_COND* tmpC2=NULL;
	ST_FAITS* tmp=Tete_Faits;
	ST_FAITS* tmp2=NULL;
	
	if(indic=='R' || indic=='r')
	{
		while(tmpR!=NULL){
			tmpR2=tmpR->suiv;
			while(tmpC!=NULL){
				tmpC2=tmpC->suiv;
				free(tmpC);
				tmpC=tmpC2;
			}
			free(tmpR);
			tmpR=tmpR2;
		}
	}
	else if(indic=='F' || indic=='f')
	{
		while(tmp!=NULL){
			tmp2=tmp->suiv;
			free(tmp);
			tmp=tmp2;
		}
	}
}

/********************************************************
**  [Fonction AfficherListe]		   	       **
**    Affiche tous les maillons de la liste chainée    **
**    indiquée par indic ("R"=Regles / "F"=Faits)      **
********************************************************/
void AfficherListe(char indic, ST_RES* Tete_Res, ST_FAITS* Tete_Faits)
{
	ST_RES *R=NULL;
	ST_COND *C=NULL;
	ST_FAITS *F=NULL;
	
	if(indic=='R' || indic=='r')
	{
		printf(">AFFICHAGE LISTE REGLES\n");
		R=Tete_Res;
		while(R!=NULL)
		{
			C=R->TeteListCond;
			printf("  -Resultat : [%s]\n",R->res);
			while(C!=NULL)
			{
				printf("    ->Condition : <%s>\n",C->cond);
				C=C->suiv;
			}
			R=R->suiv;
		}
	}
	else if(indic=='F' || indic=='f')
	{
		printf(">AFFICHAGE LISTE FAITS\n");
		F=Tete_Faits;
		while(F!=NULL)
		{
			printf("  -Fait : [%s]\n",F->fait);
			F=F->suiv;
		}
	}
	printf("\n");
}

